package dao.jdbc.SqlServer;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector;

import dao.intefaces.InterfaceClienteDAO;

import entidades.Cliente;

public class ClienteDAO implements InterfaceClienteDAO{
	private static ClienteDAO instancia = null;

	public static ClienteDAO getInstancia(){
		if (instancia == null){
			instancia = new ClienteDAO();
		}
		return instancia;
	}

	/**
	 * Graba un nuevo Cliente en la base de datos
	 * @param nuevoCliente
	 */

	public void grabarCliente(Cliente nuevoCliente) {
		// TODO Auto-generated method stub
		PreparedStatement stmt = null;
		try{
			String query = "INSERT INTO CLIENTE VALUES (?,?,?,?,?,?,?,?)";
			Connection conexion = DataSource.obtenerConexion();
			conexion.setAutoCommit(false);

			stmt = conexion.prepareStatement(query);
			stmt.setString(1, nuevoCliente.getCuit());
			stmt.setString(2, nuevoCliente.getNombre());
			stmt.setString(3, nuevoCliente.getRazonSocial());
			stmt.setString(4, nuevoCliente.getDireccion());
			stmt.setString(5, nuevoCliente.getTelefono());
			stmt.setString(6, nuevoCliente.getFax());
			stmt.setString(7, nuevoCliente.getEmail());
			stmt.setInt(8, obtenerNroCategoria(nuevoCliente.getCategoria()));

			stmt.execute();
			conexion.commit();
		}catch(Exception e){
			DataSource.rollback();
			e.printStackTrace();
		}finally{
			DataSource.cerrarConexion(stmt);
		}
	}

	private int obtenerNroCategoria(String categoria){
		// TODO Auto-generated method stub
		int nroCategoria = 0;
		PreparedStatement stmt = null;
		ResultSet resultSet = null;
		try{
			Connection conexion = DataSource.obtenerConexion();
			String query = "SELECT NROCATEGORIA FROM CATEGORIACLIENTE WHERE DESCRIPCION ="+"\'"+categoria+"\'";
			stmt = conexion.prepareStatement(query);
			resultSet = stmt.executeQuery();
			while (resultSet.next()){
				nroCategoria = resultSet.getInt("nroCategoria");
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			DataSource.cerrarConexion(resultSet, stmt);
		}
		return nroCategoria;
	}

	public Vector<String> obtenerCUIs() {
		// TODO Auto-generated method stub
		Vector<String> listadoCuits = new Vector<String>();
		String parcial;
		PreparedStatement stmt = null;
		ResultSet resultSet = null;
		try{
			Connection conexion = DataSource.obtenerConexion();
			String query = "SELECT cuit FROM CLIENTE";
			stmt = conexion.prepareStatement(query);
			resultSet = stmt.executeQuery();
			while (resultSet.next()){
				parcial = resultSet.getString("cuit");
				listadoCuits.add(parcial);
			}
		}catch(Exception e){
			e.printStackTrace();			
		}finally{
			DataSource.cerrarConexion(resultSet, stmt);
		}
		return listadoCuits;
	}

	public void borrarCliente(String selectedItem) {
		// TODO Auto-generated method stub
		Statement stmt = null;
		try{
			Connection conexion = DataSource.obtenerConexion();
			String query = "DELETE CLIENTE WHERE CUIT = "+"\'"+selectedItem+"\'";
			stmt = conexion.createStatement();
			stmt.execute(query);
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			DataSource.cerrarConexion(null, stmt);
		}
	}

	public Cliente obtenerCliente(String cuit) {
		// TODO Auto-generated method stub
		Cliente clienteBuscado = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try{
			Connection con = DataSource.obtenerConexion();
			String query = "SELECT * FROM CLIENTE WHERE CUIT = "+"\'"+cuit+"\'";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()){
				clienteBuscado = new Cliente();
				
				clienteBuscado.setCuit(cuit);
				clienteBuscado.setCategoria(CategoriaDAO.getInstancia().obtener(rs.getInt("nroCategoria")).getNombre());
				clienteBuscado.setDireccion(rs.getString("direccion"));
				clienteBuscado.setEmail(rs.getString("email"));
				clienteBuscado.setFax(rs.getString("fax"));
				clienteBuscado.setNombre(rs.getString("nombre"));
				clienteBuscado.setRazonSocial(rs.getString("razonSocial"));
				clienteBuscado.setTelefono(rs.getString("telefono"));
			}
		} catch(Exception e){
			e.printStackTrace();
		} finally {
			DataSource.cerrarConexion(rs, stmt);
		}
		return clienteBuscado;
	}

	public  void modificarCliente(String cuitViejo, Cliente clienteModificado) {
		// TODO Auto-generated method stub
		PreparedStatement stmt = null;
		try{
			Connection conexion = DataSource.obtenerConexion();
			String query = "UPDATE CLIENTE SET CUIT = ?, NOMBRE = ?, RAZONSOCIAL = ?, DIRECCION = ?, " +
					"TELEFONO = ?, FAX =?, EMAIL = ?, nroCATEGORIA = ? WHERE CUIT = "+"\'"+cuitViejo+"\'";
			conexion.setAutoCommit(false);

			stmt = conexion.prepareStatement(query);
			stmt.setString(1, clienteModificado.getCuit());
			stmt.setString(2, clienteModificado.getNombre());
			stmt.setString(3, clienteModificado.getRazonSocial());
			stmt.setString(4, clienteModificado.getDireccion());
			stmt.setString(5, clienteModificado.getTelefono());
			stmt.setString(6, clienteModificado.getFax());
			stmt.setString(7, clienteModificado.getEmail());
			stmt.setInt(8, obtenerNroCategoria(clienteModificado.getCategoria()));

			stmt.execute();
			conexion.commit();
		}catch(Exception e){
			DataSource.rollback();
			e.printStackTrace();
		}finally{
			DataSource.cerrarConexion(stmt);
		}
	}

	public boolean existeCliente(String cuit) {
		boolean resultadoOperacion = false;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try{
			Connection con = DataSource.obtenerConexion();
			String query = "SELECT * FROM CLIENTE WHERE CUIT = "+"\'"+cuit+"\'";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()){
				resultadoOperacion = true;
			}
		} catch(Exception e){
			e.printStackTrace();
		} finally {
			DataSource.cerrarConexion(rs, stmt);
		}
		return resultadoOperacion;
	}

}